WebGLã§ã®ãªã¢ã«ã¿ã€ã ã·ã£ããŠã¬ã³ããªã³ã°ã®åºæ¬æŠå¿µãšé«åºŠãªãã¯ããã¯ãåŠã³ãŸãããã®ã¬ã€ãã§ã¯ãã·ã£ããŠãããã³ã°ãPCFãCSMããããŠäžè¬çãªã¢ãŒãã£ãã¡ã¯ããžã®å¯ŸåŠæ³ã解説ããŸãã
WebGLã·ã£ããŠãããã³ã°ïŒãªã¢ã«ã¿ã€ã ã¬ã³ããªã³ã°ã®ããã®ç·åã¬ã€ã
3Dã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã®äžçã«ãããŠããªã¢ãªãºã ãšæ²¡å ¥æã«æãè²¢ç®ããèŠçŽ ã¯åœ±ã§ãã圱ã¯ããªããžã§ã¯ãéã®ç©ºéçãªé¢ä¿ãå æºã®äœçœ®ããããŠã·ãŒã³å šäœã®ãžãªã¡ããªã«é¢ããéèŠãªèŠèŠçæããããæäŸããŸãã圱ããªããã°ã3Dã®äžçã¯å¹³åŠã§ããŸãšãŸãããªãã人工çã«æããããŸããWebGLãæèŒãããŠã§ãããŒã¹ã®3Dã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãé«å質ãªãªã¢ã«ã¿ã€ã ã®åœ±ãå®è£ ããããšã¯ããããã§ãã·ã§ãã«ãªäœéšã®èšŒã§ãããã®ã¬ã€ãã§ã¯ããããå®çŸããããã®æãåºæ¬çã§åºã䜿çšãããŠãããã¯ããã¯ã§ããã·ã£ããŠãããã³ã°ã«ã€ããŠæ·±ãæãäžããŠãããŸãã
ããªããããã©ã³ã®ã°ã©ãã£ãã¯ã¹ããã°ã©ããŒã§ããã3次å ã®äžçã«è¶³ãèžã¿å ¥ãããŠã§ãéçºè ã§ããããã®èšäºã¯WebGLãããžã§ã¯ãã§ãªã¢ã«ã¿ã€ã ã®åœ±ãçè§£ããå®è£ ãããã©ãã«ã·ã¥ãŒãã£ã³ã°ããããã®ç¥èãæäŸããŸããç§ãã¡ã¯ãäžå¿çãªçè«ããå®è·µçãªå®è£ ã®è©³çްãŸã§ãæ ããäžè¬çãªèœãšã穎ãçŸä»£ã®ã°ã©ãã£ãã¯ã¹ãšã³ãžã³ã§äœ¿çšãããé«åºŠãªãã¯ããã¯ãæ¢æ±ããŸãã
第1ç« ïŒã·ã£ããŠãããã³ã°ã®åºç€
æ¬è³ªçã«ãã·ã£ããŠãããã³ã°ã¯å·§åŠã§ãšã¬ã¬ã³ããªãã¯ããã¯ã§ãããã·ãŒã³å ã®ããç¹ã圱ã®äžã«ãããã©ãããããã®ç¹ã¯å æºããèŠããŸããïŒããšããåçŽãªåãã«ãã£ãŠå€æããŸããçãããããããã§ããã°ãäœããå ãé®ã£ãŠããããšãæå³ãããã®ç¹ã¯åœ±ã®äžã«ããã¯ãã§ãããã®åãã«ããã°ã©ã çã«çãããããç§ãã¡ã¯2ãã¹ã¬ã³ããªã³ã°ã¢ãããŒãã䜿çšããŸãã
ã·ã£ããŠãããã³ã°ãšã¯ïŒäžå¿çãªæŠå¿µ
ãã®ãã¯ããã¯å šäœã¯ãã·ãŒã³ã2åãããããç°ãªãèŠç¹ããã¬ã³ããªã³ã°ããããšãäžå¿ã«å±éããŸãïŒ
- ãã¹1ïŒããã¹ãã¹ïŒå æºã®èŠç¹ïŒãæåã«ãã·ãŒã³å šäœãå æºã®æ£ç¢ºãªäœçœ®ãšåãããã¬ã³ããªã³ã°ããŸãããã ãããã®ãã¹ã§ã¯è²ããã¯ã¹ãã£ã¯æ°ã«ããŸãããå¿ èŠãªæ å ±ã¯æ·±åºŠã®ã¿ã§ããã¬ã³ããªã³ã°ãããåãªããžã§ã¯ãã«ã€ããŠãå æºããã®è·é¢ãèšé²ããŸãããã®æ·±åºŠå€ã®éãŸãã¯ãã·ã£ããŠããããŸãã¯ããã¹ããããšåŒã°ããç¹å¥ãªãã¯ã¹ãã£ã«æ ŒçŽãããŸãããã®ãããã®åãã¯ã»ã«ã¯ãç¹å®ã®æ¹åã«ãããå æºã®èŠç¹ããæãè¿ããªããžã§ã¯ããŸã§ã®è·é¢ã衚ããŸãã
- ãã¹2ïŒã·ãŒã³ãã¹ïŒã«ã¡ã©ã®èŠç¹ïŒã次ã«ãã¡ã€ã³ã«ã¡ã©ã®èŠç¹ããéåžžéãã«ã·ãŒã³ãã¬ã³ããªã³ã°ããŸããããããæç»ããããã¹ãŠã®ãã¯ã»ã«ã«å¯ŸããŠã远å ã®èšç®ãå®è¡ããŸãããã®ãã¯ã»ã«ã®3D空éã§ã®äœçœ®ã決å®ããããã®ç¹ã¯å æºããã©ããããã®è·é¢ã«ãããŸããïŒããšåããããŸãããããŠããã®è·é¢ãã察å¿ããäœçœ®ã®ã·ã£ããŠãããïŒãã¹1ã§äœæïŒã«æ ŒçŽãããå€ãšæ¯èŒããŸãã
ããžãã¯ã¯åçŽã§ãïŒ
- ãã¯ã»ã«ã®çŸåšã®å æºããã®è·é¢ããã·ã£ããŠãããã«æ ŒçŽãããè·é¢ããã倧ããå Žåãããã¯åãèŠç·äžã«ãã£ãšå æºã«è¿ãå¥ã®ãªããžã§ã¯ããããããšãæå³ããŸãããããã£ãŠãçŸåšã®ãã¯ã»ã«ã¯åœ±ã®äžã«ãããŸãã
- ãã¯ã»ã«ã®è·é¢ããã·ã£ããŠãããã®è·é¢ä»¥äžã§ããå Žåãããã¯äœãé®ããã®ããªãããšãæå³ãããã¯ã»ã«ã¯å®å šã«ç §ããããŠããŸãã
ã·ãŒã³ã®ã»ããã¢ãã
WebGLã§ã·ã£ããŠãããã³ã°ãå®è£ ããã«ã¯ãããã€ãã®äž»èŠãªã³ã³ããŒãã³ããå¿ èŠã§ãïŒ
- å æºïŒããã¯ãã£ã¬ã¯ã·ã§ãã«ã©ã€ãïŒå€ªéœãªã©ïŒããã€ã³ãã©ã€ãïŒé»çãªã©ïŒããŸãã¯ã¹ãããã©ã€ãã§ããã©ã€ãã®çš®é¡ã«ãã£ãŠãããã¹ãã¹äžã«äœ¿çšããããããžã§ã¯ã·ã§ã³è¡åã®çš®é¡ã決ãŸããŸãã
- ãã¬ãŒã ãããã¡ãªããžã§ã¯ãïŒFBOïŒïŒWebGLã¯éåžžãç»é¢ã®ããã©ã«ããã¬ãŒã ãããã¡ã«ã¬ã³ããªã³ã°ããŸããã·ã£ããŠããããäœæããã«ã¯ããªãã¹ã¯ãªãŒã³ã®ã¬ã³ããŒã¿ãŒã²ãããå¿ èŠã§ããFBOã䜿çšãããšãç»é¢ã®ä»£ããã«ãã¯ã¹ãã£ã«ã¬ã³ããªã³ã°ã§ããŸããç§ãã¡ã®FBOã¯ãããã¹ãã¯ã¹ãã£ã®ã¢ã¿ããã¡ã³ãã§èšå®ãããŸãã
- 2ã»ããã®ã·ã§ãŒããŒïŒããã¹ãã¹çšã®ã·ã§ãŒããŒããã°ã©ã ïŒéåžžã«ã·ã³ãã«ãªãã®ïŒãšãæçµçãªã·ãŒã³ãã¹çšã®ã·ã§ãŒããŒããã°ã©ã ïŒåœ±ã®èšç®ããžãã¯ãå«ããã®ïŒãå¿ èŠã§ãã
- è¡åïŒã«ã¡ã©çšã®æšæºçãªã¢ãã«ããã¥ãŒããããžã§ã¯ã·ã§ã³è¡åãå¿ èŠã§ããéèŠãªããšã«ãå æºçšã®ãã¥ãŒè¡åãšãããžã§ã¯ã·ã§ã³è¡åãå¿ èŠã§ããããã¯ãã°ãã°åäžã®ãã©ã€ã空éè¡åãã«çµåãããŸãã
第2ç« ïŒ2ãã¹ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®è©³çް
2ã€ã®ã¬ã³ããªã³ã°ãã¹ããè¡åãšã·ã§ãŒããŒã®åœ¹å²ã«çŠç¹ãåœãŠãŠãã¹ããããã€ã¹ãããã§èŠãŠãããŸãããã
ãã¹1ïŒããã¹ãã¹ïŒå æºã®èŠç¹ããïŒ
ãã®ãã¹ã®ç®æšã¯ãããã¹ãã¯ã¹ãã£ãçæããããšã§ãããã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãïŒ
- FBOããã€ã³ãããïŒæç»ããåã«ãWebGLã«ãã£ã³ãã¹ã§ã¯ãªãã«ã¹ã¿ã FBOã«ã¬ã³ããªã³ã°ããããæç€ºããŸãã
- ãã¥ãŒããŒããèšå®ããïŒãã¥ãŒããŒãã®å¯žæ³ãã·ã£ããŠããããã¯ã¹ãã£ã®ãµã€ãºïŒäŸïŒ1024x1024ãã¯ã»ã«ïŒã«åãããŸãã
- ããã¹ãããã¡ãã¯ãªã¢ããïŒã¬ã³ããªã³ã°åã«FBOã®ããã¹ãããã¡ãã¯ãªã¢ãããŠããããšã確èªããŸãã
- å
æºã®è¡åãäœæããïŒ
- ã©ã€ããã¥ãŒè¡åïŒãã®è¡åã¯ã¯ãŒã«ããå æºã®èŠç¹ã«å€æããŸãããã£ã¬ã¯ã·ã§ãã«ã©ã€ãã®å Žåãããã¯éåžž`lookAt`颿°ã§äœæããããeyeããå æºã®äœçœ®ããtargetããå æºãæãæ¹åã«ãªããŸãã
- ã©ã€ããããžã§ã¯ã·ã§ã³è¡åïŒå¹³è¡ãªå ç·ãæã€ãã£ã¬ã¯ã·ã§ãã«ã©ã€ãã«ã¯ãæ£å°åœ±ïŒOrthographic ProjectionïŒã䜿çšãããŸãããã€ã³ãã©ã€ããã¹ãããã©ã€ãã«ã¯ãéèŠæåœ±ïŒPerspective ProjectionïŒã䜿çšãããŸãããã®è¡åã¯ã圱ãèœãšã空éã®ããªã¥ãŒã ïŒããã¯ã¹ãŸãã¯ãã©ã¹ã¿ã ïŒãå®çŸ©ããŸãã
- ããã¹ã·ã§ãŒããŒããã°ã©ã ã䜿çšããïŒããã¯æå°éã®ã·ã§ãŒããŒã§ããé ç¹ã·ã§ãŒããŒã®å¯äžã®ä»äºã¯ãé ç¹äœçœ®ã«å æºã®ãã¥ãŒè¡åãšãããžã§ã¯ã·ã§ã³è¡åãä¹ç®ããããšã§ãããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ããã«ã·ã³ãã«ã§ããã©ã°ã¡ã³ãã®æ·±åºŠå€ïŒãã®z座æšïŒãããã¹ãã¯ã¹ãã£ã«æžã蟌ãã ãã§ããçŸä»£ã®WebGLã§ã¯ãFBOãèªåçã«ããã¹ãããã¡ããã£ããã£ããããã«èšå®ã§ãããããã«ã¹ã¿ã ã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯äžèŠãªå Žåãå€ãã§ãã
- ã·ãŒã³ãã¬ã³ããªã³ã°ããïŒã·ãŒã³å ã®ãã¹ãŠã®åœ±ãèœãšããªããžã§ã¯ããæç»ããŸããããã§FBOã«ã¯å®æããã·ã£ããŠããããå«ãŸããŸãã
ãã¹2ïŒã·ãŒã³ãã¹ïŒã«ã¡ã©ã®èŠç¹ããïŒ
次ã«ãäœæããã·ã£ããŠãããã䜿çšããŠåœ±ã決å®ããæçµçãªç»åãã¬ã³ããªã³ã°ããŸãã
- FBOã®ãã€ã³ããè§£é€ããïŒããã©ã«ãã®ãã£ã³ãã¹ãã¬ãŒã ãããã¡ãžã®ã¬ã³ããªã³ã°ã«æ»ããŸãã
- ãã¥ãŒããŒããèšå®ããïŒãã¥ãŒããŒãããã£ã³ãã¹ã®å¯žæ³ã«æ»ããŸãã
- ç»é¢ãã¯ãªã¢ããïŒãã£ã³ãã¹ã®ã«ã©ãŒãããã¡ãšããã¹ãããã¡ãã¯ãªã¢ããŸãã
- ã·ãŒã³ã·ã§ãŒããŒããã°ã©ã ã䜿çšããïŒããã§éæ³ãèµ·ãããŸãããã®ã·ã§ãŒããŒã¯ããè€éã§ãã
- é ç¹ã·ã§ãŒããŒïŒãã®ã·ã§ãŒããŒã¯2ã€ã®ããšãè¡ãå¿ èŠããããŸãããŸããéåžžéãã«ã¡ã©ã®ã¢ãã«ããã¥ãŒããããžã§ã¯ã·ã§ã³è¡åã䜿çšããŠæçµçãªé ç¹äœçœ®ãèšç®ããŸããæ¬¡ã«ããã¹1ã®ã©ã€ã空éè¡åã䜿çšããŠãå æºã®èŠç¹ããã®é ç¹ã®äœçœ®ãèšç®ããªããã°ãªããŸããããã®2çªç®ã®åº§æšã¯ãvaryingãšããŠãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒããã圱ã®ããžãã¯ã®äžæ žã§ããåãã©ã°ã¡ã³ãã«ã€ããŠïŒ
- é ç¹ã·ã§ãŒããŒããè£éãããã©ã€ã空éã§ã®äœçœ®ãåãåããŸãã
- ãã®åº§æšã«å¯ŸããŠããŒã¹ãã¯ãã£ãé€ç®ïŒxãyãzãwã§å²ãïŒãå®è¡ããŸããããã«ããã座æšã¯æ£èŠåããã€ã¹åº§æšïŒNDCïŒã«å€æããã-1ãã1ã®ç¯å²ã«ãªããŸãã
- NDCããã¯ã¹ãã£åº§æšïŒ0ãã1ã®ç¯å²ïŒã«å€æããã·ã£ããŠãããããµã³ããªã³ã°ã§ããããã«ããŸããããã¯åçŽãªã¹ã±ãŒã«ãšãã€ã¢ã¹ã®æäœã§ãïŒ `texCoord = ndc * 0.5 + 0.5;`ã
- ãããã®ãã¯ã¹ãã£åº§æšã䜿çšããŠããã¹1ã§äœæãããã·ã£ããŠããããã¯ã¹ãã£ããµã³ããªã³ã°ããŸããããã«ãã`depthFromShadowMap`ãåŸãããŸãã
- å æºã®èŠç¹ããã®ãã©ã°ã¡ã³ãã®çŸåšã®æ·±åºŠã¯ã倿ãããã©ã€ã空é座æšã®zæåã§ããããã`currentDepth`ãšåŒã³ãŸãããã
- æ·±åºŠãæ¯èŒããïŒ `currentDepth > depthFromShadowMap`ã®å Žåããã©ã°ã¡ã³ãã¯åœ±ã®äžã«ãããŸããæ¬¡ã«èª¬æãããã·ã£ããŠã¢ã¯ãããšåŒã°ããã¢ãŒãã£ãã¡ã¯ããé¿ããããã«ããã®ãã§ãã¯ã«å°ããªãã€ã¢ã¹ã远å ããå¿ èŠããããŸãã
- æ¯èŒã«åºã¥ããŠãã·ã£ããŠä¿æ°ã決å®ããŸãïŒäŸïŒç §ããããŠããå Žåã¯1.0ã圱ã®å Žåã¯0.3ïŒã
- ãã®ã·ã£ããŠä¿æ°ãæçµçãªè²ã®èšç®ã«é©çšããŸãïŒäŸïŒã¢ã³ããšã³ãå ãšãã£ãã¥ãŒãºå ã®æåã«ã·ã£ããŠä¿æ°ãä¹ç®ããïŒã
- ã·ãŒã³ãã¬ã³ããªã³ã°ããïŒã·ãŒã³å ã®ãã¹ãŠã®ãªããžã§ã¯ããæç»ããŸãã
第3ç« ïŒäžè¬çãªåé¡ãšè§£æ±ºç
åºæ¬çãªã·ã£ããŠãããã³ã°ãå®è£ ãããšãããã«ããã€ãã®äžè¬çãªèŠèŠçã¢ãŒãã£ãã¡ã¯ããçŸããŸããããããçè§£ãä¿®æ£ããããšããé«å質ãªçµæãåŸãããã«äžå¯æ¬ ã§ãã
ã·ã£ããŠã¢ã¯ãïŒèªå·±ã·ã£ããŠã€ã³ã°ã¢ãŒãã£ãã¡ã¯ãïŒ
åé¡ïŒå®å šã«ç §ããããŠããã¯ãã®ãµãŒãã§ã¹ã«ãå¥åŠã§äžæ£ç¢ºãªæãç·ãã¢ã¢ã¬ã®ãããªãã¿ãŒã³ãèŠããããšããããŸããããã¯ãã·ã£ããŠã¢ã¯ãããšåŒã°ããŸããããã¯ãã·ã£ããŠãããã«æ ŒçŽãããæ·±åºŠå€ãšãã·ãŒã³ãã¹äžã«èšç®ãããæ·±åºŠå€ãåããµãŒãã§ã¹ã®ãã®ã§ããããã«çºçããŸããæµ®åå°æ°ç¹æ°ã®äžæ£ç¢ºããã·ã£ããŠãããã®è§£å床ã®éçã«ãããããããªèª€å·®ããã©ã°ã¡ã³ãã誀ã£ãŠèªèº«ã®èåŸã«ãããšå€æãããèªå·±ã·ã£ããŠã€ã³ã°ãåŒãèµ·ãããŸãã
解決çïŒããã¹ãã€ã¢ã¹ãæãåçŽãªè§£æ±ºçã¯ãæ¯èŒã®åã«`currentDepth`ã«å°ããªãã€ã¢ã¹ãå°å ¥ããããšã§ãããã©ã°ã¡ã³ããå®éããããããã«å æºã«è¿ã¥ããããšã§ãèªèº«ã®åœ±ãããæŒãåºããããšãã§ããŸãã
float shadow = currentDepth > depthFromShadowMap + bias ? 0.3 : 1.0;
é©åãªãã€ã¢ã¹å€ãèŠã€ããããšã¯ãç¹çްãªãã©ã³ã¹èª¿æŽãå¿ èŠã§ããå°ãããããšã¢ã¯ããæ®ãã倧ãããããšæ¬¡ã®åé¡ãçºçããŸãã
ããŒã¿ãŒãã³ãã³ã°
åé¡ïŒãã®ã¢ãŒãã£ãã¡ã¯ãã¯ãé£ã¶ããšãã§ããŠåœ±ã倱ã£ããã£ã©ã¯ã¿ãŒã«ã¡ãªãã§åä»ãããããªããžã§ã¯ããšãã®åœ±ã®éã«ç®ã«èŠããééãšããŠçŸããŸããããã«ããããªããžã§ã¯ããæµ®ããŠããããã«èŠããããæ¥ããŠããã¯ãã®ãµãŒãã§ã¹ããåãé¢ãããŠããããã«èŠããŸããããã¯ã倧ããããããã¹ãã€ã¢ã¹ã䜿çšããçŽæ¥çãªçµæã§ãã
解決çïŒã¹ããŒãã¹ã±ãŒã«ããã¹ãã€ã¢ã¹ãäžå®ã®ãã€ã¢ã¹ãããå ç¢ãªè§£æ±ºçã¯ãå æºã«å¯ŸãããµãŒãã§ã¹ã®åŸæã«å¿ããŠãã€ã¢ã¹ãå€åãããããšã§ããæ¥ãªããªãŽã³ã¯ã¢ã¯ããçºçããããããã倧ããªãã€ã¢ã¹ãå¿ èŠã§ããå¹³åŠãªããªãŽã³ã¯ããå°ããªãã€ã¢ã¹ã§æžã¿ãŸããWebGLãå«ãã»ãšãã©ã®ã°ã©ãã£ãã¯ã¹APIã¯ãããã¹ãã¹äžã«ãã®çš®ã®ãã€ã¢ã¹ãèªåçã«é©çšããæ©èœãæäŸããŠãããããã¯éåžžããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ã®æåãã€ã¢ã¹ãããæãŸããã§ãã
ããŒã¹ãã¯ãã£ããšã€ãªã¢ã·ã³ã°ïŒãžã£ã®ãŒãšããžïŒ
åé¡ïŒåœ±ã®ãšããžããããã¯ç¶ã§ã®ã¶ã®ã¶ããã¯ã»ã«åããŠèŠããŸããããã¯ãšã€ãªã¢ã·ã³ã°ã®äžåœ¢æ ã§ããããã¯ãã·ã£ããŠãããã®è§£å床ãæéã§ããããã«çºçããŸããã·ã£ããŠãããã®1ã€ã®ãã¯ã»ã«ïŒãŸãã¯ãã¯ã»ã«ïŒããç¹ã«ã«ã¡ã©ã«è¿ããµãŒãã§ã¹ãæµ ãè§åºŠã§èŠããããµãŒãã§ã¹äžã§ãæçµã·ãŒã³ã®åºãé åãã«ããŒããå¯èœæ§ããããŸãããã®è§£å床ã®äžäžèŽããç¹åŸŽçãªãããã¯ç¶ã®å€èгãåŒãèµ·ãããŸãã
解決çïŒã·ã£ããŠãããã®è§£å床ãäžããïŒäŸïŒ1024x1024ãã4096x4096ãžïŒããšã¯å©ãã«ãªããŸãããã¡ã¢ãªãšããã©ãŒãã³ã¹ã«å€§ããªã³ã¹ããããããæ ¹æ¬çãªåé¡ãå®å šã«ã¯è§£æ±ºããŸãããçã®è§£æ±ºçã¯ãããé«åºŠãªãã¯ããã¯ã«ãããŸãã
第4ç« ïŒé«åºŠãªã·ã£ããŠãããã³ã°ãã¯ããã¯
åºæ¬çãªã·ã£ããŠãããã³ã°ã¯åºç€ãæäŸããŸããããããã§ãã·ã§ãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¹ã«ãšã€ãªã¢ã·ã³ã°ãªã©ã®å¶éãå æããããã«ãããæŽç·Žãããã¢ã«ãŽãªãºã ã䜿çšãããŸãã
Percentage-Closer Filtering (PCF)
PCFã¯ã圱ã®ãšããžãæããããããšã€ãªã¢ã·ã³ã°ã軜æžããããã®æãäžè¬çãªãã¯ããã¯ã§ããã·ã£ããŠãããããåäžã®ãµã³ãã«ãååŸããŠãã€ããªïŒåœ±ã®äžãå€ãïŒã®æ±ºå®ãäžã代ããã«ãPCFã¯ã¿ãŒã²ãã座æšåšèŸºã®é åããè€æ°ã®ãµã³ãã«ãååŸããŸãã
æŠå¿µïŒåãã©ã°ã¡ã³ãã«ã€ããŠãã·ã£ããŠããããäžåºŠã ãã§ãªãããã©ã°ã¡ã³ãã®æåœ±ããããã¯ã¹ãã£åº§æšã®åšãã®ã°ãªãããã¿ãŒã³ïŒäŸïŒ3x3ãŸãã¯5x5ïŒã§ãµã³ããªã³ã°ããŸãããããã®åãµã³ãã«ã«ã€ããŠã深床æ¯èŒãå®è¡ããŸããæçµçãªåœ±ã®å€ã¯ãããããã¹ãŠã®æ¯èŒã®å¹³åå€ã«ãªããŸããäŸãã°ã9ã€ã®ãµã³ãã«ã®ãã¡4ã€ã圱ã®äžã«ããå Žåããã©ã°ã¡ã³ãã¯4/9ã ã圱ã«ãªããæ»ãããªå圱ïŒåœ±ã®æããããšããžïŒãçãŸããŸãã
å®è£ ïŒããã¯å®å šã«ãã©ã°ã¡ã³ãã·ã§ãŒããŒå ã§è¡ãããŸããå°ããªã«ãŒãã«ãå埩åŠçããã«ãŒããå«ã¿ãåãªãã»ããã§ã·ã£ããŠãããããµã³ããªã³ã°ããçµæãèç©ããŸããWebGL 2ã¯ããŒããŠã§ã¢ãµããŒãïŒ`sampler2DShadow`ã䜿çšãã`texture`ïŒãæäŸããŠãããæ¯èŒãšãã£ã«ã¿ãªã³ã°ãããå¹ççã«å®è¡ã§ããŸãã
å©ç¹ïŒç¡¬ããšã€ãªã¢ã·ã³ã°ããããšããžãæ»ããã§æããããšããžã«çœ®ãæããããšã§ã圱ã®å質ãåçã«åäžãããŸãã
ã³ã¹ãïŒããã©ãŒãã³ã¹ã¯ããã©ã°ã¡ã³ãããšã«ååŸããããµã³ãã«æ°ã«å¿ããŠäœäžããŸãã
Cascaded Shadow Maps (CSM)
CSMã¯ãéåžžã«åºå€§ãªã·ãŒã³ã«ãããŠåäžã®ãã£ã¬ã¯ã·ã§ãã«ã©ã€ãïŒå€ªéœãªã©ïŒããã®åœ±ãã¬ã³ããªã³ã°ããããã®æ¥çæšæºã®ãœãªã¥ãŒã·ã§ã³ã§ããããŒã¹ãã¯ãã£ããšã€ãªã¢ã·ã³ã°ã®åé¡ã«çŽæ¥åãçµã¿ãŸãã
æŠå¿µïŒäžå¿çãªã¢ã€ãã¢ã¯ãã«ã¡ã©ã«è¿ããªããžã§ã¯ãã¯é ãã®ãªããžã§ã¯ããããã¯ããã«é«ãã·ã£ããŠè§£å床ãå¿ èŠãšãããšããããšã§ããCSMã¯ãã«ã¡ã©ã®èŠéå°ïŒãã¥ãŒãã©ã¹ã¿ã ïŒããã®æ·±åºŠã«æ²¿ã£ãŠããã€ãã®ã»ã¯ã·ã§ã³ããŸãã¯ãã«ã¹ã±ãŒããã«åå²ããŸãããããŠãåã«ã¹ã±ãŒãã«å¯ŸããŠåå¥ã®é«å質ãªã·ã£ããŠããããã¬ã³ããªã³ã°ãããŸããã«ã¡ã©ã«æãè¿ãã«ã¹ã±ãŒãã¯ã¯ãŒã«ã空éã®å°ããªé åãã«ããŒãããããéåžžã«é«ãå®å¹è§£å床ãæã¡ãŸããé ãã®ã«ã¹ã±ãŒãã¯åããã¯ã¹ãã£ãµã€ãºã§åŸã ã«åºãé åãã«ããŒããŸããããããã®è©³çްã¯ãã¬ã€ã€ãŒã«ã¯ããŸãèŠããªããã蚱容ãããŸãã
å®è£ ïŒããã¯ããªãè€éã§ãã
- CPUåŽã§ãã«ã¡ã©ã®ãã©ã¹ã¿ã ã2ã4ã€ã®ã«ã¹ã±ãŒãã«åå²ããŸãã
- åã«ã¹ã±ãŒãã«ã€ããŠããã®ãã©ã¹ã¿ã ã®ã»ã¯ã·ã§ã³ãå®å šã«å²ãããã«ãã©ã€ãçšã®ã¿ã€ããªæ£å°åœ±è¡åãèšç®ããŸãã
- ã¬ã³ããªã³ã°ã«ãŒãå ã§ãããã¹ãã¹ãè€æ°åå®è¡ããŸãâåã«ã¹ã±ãŒãããšã«1åãç°ãªãã·ã£ããŠãããïŒãŸãã¯ãã¯ã¹ãã£ã¢ãã©ã¹ã®é åïŒã«ã¬ã³ããªã³ã°ããŸãã
- æçµçãªã·ãŒã³ãã¹ã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãçŸåšã®ãã©ã°ã¡ã³ããã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠã©ã®ã«ã¹ã±ãŒãã«å±ãããã倿ããŸãã
- é©åãªã«ã¹ã±ãŒãã®ã·ã£ããŠãããããµã³ããªã³ã°ããŠã圱ãèšç®ããŸãã
å©ç¹ïŒåºå€§ãªè·é¢ã«ããã£ãŠäžè²«ããŠé«è§£å床ã®åœ±ãæäŸãããããå±å€ç°å¢ã«æé©ã§ãã
Variance Shadow Maps (VSM)
VSMã¯ãœããã·ã£ããŠãäœæããããã®å¥ã®ãã¯ããã¯ã§ãããPCFãšã¯ç°ãªãã¢ãããŒããåããŸãã
æŠå¿µïŒã·ã£ããŠãããã«æ·±åºŠã ããæ ŒçŽãã代ããã«ãVSMã¯2ã€ã®å€ãæ ŒçŽããŸãïŒæ·±åºŠïŒ1次ã¢ãŒã¡ã³ãïŒãšæ·±åºŠã®2ä¹ïŒ2次ã¢ãŒã¡ã³ãïŒã§ããããã2ã€ã®å€ã«ãããæ·±åºŠååžã®åæ£ãèšç®ã§ããŸãããã§ãã·ã§ãã®äžçåŒãšåŒã°ããæ°åŠçããŒã«ã䜿çšããŠããã©ã°ã¡ã³ãã圱ã®äžã«ãã確çãæšå®ã§ããŸããäž»ãªå©ç¹ã¯ãVSMãã¯ã¹ãã£ã¯æšæºã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããç·åœ¢ãã£ã«ã¿ãªã³ã°ãããããããã³ã°ã䜿çšããŠãŒããããšãã§ããããšã§ããããã¯æšæºã®ããã¹ãããã§ã¯æ°åŠçã«ç¡å¹ã§ããããã«ãããåºå®ã®ããã©ãŒãã³ã¹ã³ã¹ãã§éåžžã«å€§ãããæããããæ»ãããªåœ±ã®å圱ãå¯èœã«ãªããŸãã
æ¬ ç¹ïŒVSMã®äž»ãªåŒ±ç¹ã¯ãã©ã€ãããªãŒãã£ã³ã°ãã§ããããã¯ããªã¯ã«ãŒããŒãéãªãç¶æ³ã§å ããªããžã§ã¯ããééããŠèŠããçŸè±¡ã§ãçµ±èšçè¿äŒŒãç Žç¶»ããããã«çºçããå¯èœæ§ããããŸãã
第5ç« ïŒå®è·µçãªå®è£ ã®ãã³ããšããã©ãŒãã³ã¹
ã·ã£ããŠãããè§£å床ã®éžæ
ã·ã£ããŠãããã®è§£å床ã¯ãå質ãšããã©ãŒãã³ã¹ã®çŽæ¥çãªãã¬ãŒããªãã§ãã倧ããªãã¯ã¹ãã£ã¯ããã·ã£ãŒããªåœ±ãæäŸããŸãããããå€ãã®ãããªã¡ã¢ãªãæ¶è²»ããã¬ã³ããªã³ã°ãšãµã³ããªã³ã°ã«æéãããããŸããäžè¬çãªãµã€ãºã¯æ¬¡ã®ãšããã§ãïŒ
- 1024x1024ïŒå€ãã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠè¯å¥œãªããŒã¹ã©ã€ã³ã§ãã
- 2048x2048ïŒãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã§é¡èãªå質åäžããããããŸãã
- 4096x4096ïŒé«å質ã§ãäž»èŠãªã¢ã»ãããå ç¢ãªã«ãªã³ã°ãæã€ãšã³ãžã³ã§ãã䜿çšãããŸãã
ã©ã€ãã®ãã©ã¹ã¿ã ã®æé©å
ã·ã£ããŠãããã®ãã¹ãŠã®ãã¯ã»ã«ãæå€§éã«æŽ»çšããããã«ã¯ãã©ã€ãã®ãããžã§ã¯ã·ã§ã³ããªã¥ãŒã ïŒãã®æ£å°åœ±ããã¯ã¹ãŸãã¯éèŠæåœ±ãã©ã¹ã¿ã ïŒãã圱ãå¿ èŠãšããã·ãŒã³èŠçŽ ã«ã§ããã ããŽã£ãããšé©åããŠããããšãéèŠã§ãããã£ã¬ã¯ã·ã§ãã«ã©ã€ãã®å Žåãããã¯ã«ã¡ã©ã®ãã©ã¹ã¿ã ã®å¯èŠéšåã®ã¿ãå²ãããã«æ£å°åœ±ãé©åãããããšãæå³ããŸããã·ã£ããŠãããã®ç¡é§ãªã¹ããŒã¹ã¯ãç¡é§ãªè§£å床ã§ãã
WebGLã®æ¡åŒµæ©èœãšããŒãžã§ã³
WebGL 1 vs. WebGL 2ïŒã·ã£ããŠãããã³ã°ã¯WebGL 1ã§ãå¯èœã§ãããWebGL 2ã®æ¹ãã¯ããã«ç°¡åã§å¹ççã§ããWebGL 1ã§ã¯ããã¹ãã¯ã¹ãã£ãäœæããããã«`WEBGL_depth_texture`æ¡åŒµæ©èœãå¿ èŠã§ããWebGL 2ã«ã¯ãã®æ©èœãçµã¿èŸŒãŸããŠããŸããããã«ãWebGL 2ã¯ã·ã£ããŠãµã³ãã©ãŒïŒ`sampler2DShadow`ïŒãžã®ã¢ã¯ã»ã¹ãæäŸããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããPCFãå®è¡ã§ãããããã·ã§ãŒããŒã§ã®æåPCFã«ãŒãã«æ¯ã¹ãŠå€§å¹ ãªããã©ãŒãã³ã¹åäžãåŸãããŸãã
圱ã®ãããã°
圱ã®ãããã°ã¯éåžžã«é£ããããšã§ç¥ãããŠããŸããæã圹ç«ã€ãã¯ããã¯ã¯ãã·ã£ããŠããããèŠèŠåããããšã§ããã¢ããªã±ãŒã·ã§ã³ãäžæçã«å€æŽããŠãç¹å®ã®å æºããã®ããã¹ãã¯ã¹ãã£ãç»é¢äžã®ã¯ã¢ããã«çŽæ¥ã¬ã³ããªã³ã°ããŸããããã«ãããã©ã€ãããèŠãŠããããã®ãæ£ç¢ºã«ç¢ºèªã§ããŸããããã¯ãã©ã€ãã®è¡åããã©ã¹ã¿ã ã«ãªã³ã°ããŸãã¯ããã¹ãã¹äžã®ãªããžã§ã¯ãã¬ã³ããªã³ã°ã«é¢ããåé¡ãå³åº§ã«æããã«ããããšãã§ããŸãã
çµè«
ãªã¢ã«ã¿ã€ã ã·ã£ããŠãããã³ã°ã¯ãçŸä»£ã®3Dã°ã©ãã£ãã¯ã¹ã®åºç€ã§ãããå¹³åŠã§çåœæã®ãªãã·ãŒã³ããä¿¡ææ§ã®ãããã€ãããã¯ãªäžçãžãšå€è²ãããŸããå æºã®èŠç¹ããã¬ã³ããªã³ã°ãããšããæŠå¿µã¯ã·ã³ãã«ã§ãããé«å質ã§ã¢ãŒãã£ãã¡ã¯ãã®ãªãçµæãéæããã«ã¯ã2ãã¹ãã€ãã©ã€ã³ããããã¹ãã€ã¢ã¹ããšã€ãªã¢ã·ã³ã°ã®ãã¥ã¢ã³ã¹ãŸã§ãæ ¹åºã«ããã¡ã«ããºã ã®æ·±ãçè§£ãå¿ èŠã§ãã
åºæ¬çãªå®è£ ããå§ããããšã§ãã·ã£ããŠã¢ã¯ãããžã£ã®ãŒãšããžã®ãããªäžè¬çãªã¢ãŒãã£ãã¡ã¯ãã«æ®µéçã«åãçµãããšãã§ããŸããããããããœããã·ã£ããŠã®ããã®PCFãå€§èŠæš¡ç°å¢ã®ããã®Cascaded Shadow Mapsã®ãããªé«åºŠãªãã¯ããã¯ã§ããžã¥ã¢ã«ãåäžãããããšãã§ããŸããã·ã£ããŠã¬ã³ããªã³ã°ãžã®æ ã¯ãã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ãéåžžã«é åçã«ããèžè¡ãšç§åŠã®èåã®å®ç§ãªäŸã§ãããããã®ãã¯ããã¯ã詊ãããã®éçãæŒãåºããWebGLãããžã§ã¯ãã«æ°ããªã¬ãã«ã®ãªã¢ãªãºã ãããããããšããå§ãããŸãã